package org.example.shop_front_api.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * JWT工具类：生成Token、验证Token有效性（非静态方法，支持Spring注入）
 */
@Component
public class JwtUtils {
    // 密钥（确保与生成Token时使用的密钥完全一致）
    private static final String SECRET = "your-secret-key-32bytes-long-123456";
    // Token过期时间：2小时（单位：毫秒）
    private static final long EXPIRATION = 7200000;

    /**
     * 生成JWT Token（非静态方法）
     */
    public String generateToken(String username) {
        SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes());
        return Jwts.builder()
                .setSubject(username) // 存储用户名
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)) // 过期时间
                .signWith(key) // 签名加密
                .compact();
    }

    /**
     * 验证Token并解析用户名（非静态方法）
     */
    public String validateTokenAndGetUsername(String token) {
        try {
            SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes());

            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(key) // 验签密钥
                    .build()
                    .parseClaimsJws(token)
                    .getBody();

            // 校验过期时间
            if (claims.getExpiration().before(new Date())) {
                throw new ExpiredJwtException(null, claims, "令牌已过期");
            }

            return claims.getSubject(); // 返回用户名
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("令牌已过期");
        } catch (Exception e) {
            throw new RuntimeException("令牌无效（签名不匹配或格式错误）");
        }
    }

    // 提供过期时间获取方法（供Redis存储使用）
    public long getExpiration() {
        return EXPIRATION;
    }
}